
/**
 *  第一题
 * 执行结果 输出 10
 * i是用var定义的,并不会跟for循环作用域绑定,所以每一次循环访问的是同一个变量
 * for循环结束这个变量最终变为10,所以输出结果为10
 */
var a = []
for (var i = 0; i < 10; i++) {
    a[i] = function () {
        console.log(i)
    }
}
a[6]()


/**
 *  第二题
 *  结果报错
 * 全局作用域定义了temp,首先编译阶段会在变量环境环境中声明一个变量temp ,并给他赋值为undefind.随后在执行阶段会给他赋值为123
 * 在块级作用域定义的temp,由于是使用let定义的变量,所以在编译阶段会在词法环境中定义一个变量temp但是没有初始化
 * 执行阶段console.log(temp) 的时候,查找变量的顺序是先在词法环境中查找,再到变量环境中查找,然后顺着作用域链一直找下去.
 * 此处在词法环境中找到了temp,就访问他,但是temp没有被初始化,temp指向的是无效的内存空间,所以报错
 */

// var temp = 123
// if (true) {
//     console.log(temp)
//     let temp
// }


/**
 * 第三题
 */
var arr = [12, 34, 32, 89, 4]
let min = arr.sort((a, b) => a - b)[0]
console.log(min)


/**
 *  第四题
 * var var声明的变量会在当前作用域的变量环境中.var声明的变量被提升到作用域的顶部,作用域其他地方都可以访问.
 * let 声明的变量会存放在当前作用域的词法环境中,块作用域内部使用let和const声明的变量都会被压到词法环境的栈顶,当块作用域执行完毕之后被弹栈销毁,所以只能块级作用域内部能访问.
 * const 在let的基础上加上了声明之后不可修改的特性
 */

/**
 *  第五题
 * 结果为20
 * obj.fn() fu函数隐式绑定了this,this指向obj,
 * setTimeout使用了箭头函数,箭头函数的this指向当前的作用域中的this,也就是obj
 * 最终读取了obj的a属性,结果20
 */
var a = 10
var obj = {
    a: 20,
    fn() {
        setTimeout(() => {
            console.log(this.a)
        });
    }
}
obj.fn()


/**
 *  第6题
 * symbol,可以作为js特定的属性名,来拓展对象的功能,比如Symbol.iterator
 * symbol,做为普通对象的属性名
 * symbol,可以初始化出一个全局唯一的对象
 */


/**
 *  第七题
 * 浅拷贝:指针拷贝,也就是对象地址拷贝,不会创建新的对象,大家指向的是同一个对象.
 * 深拷贝:对象拷贝,创建一个新对象,新对象的值和老对象完全一样,甚至新对象的引用对象也要深拷贝一个新对象.
 * 新对象和老对象没有联系,修改其中一个对象不会对另外一个对象产生影响.
 */

/**
 *  第八题
 * TypeScript 是javaScript的超集,最终会转化成javaScript去执行.
 * TypeScript 在  javaScript 基础上加上了类型约束,类型推断,让代码的安全性更高
 */



/**
*  第九题
* 优点:使用TS能大大提高代码质量,有利于大项目的后期维护,有助于多人协调开发.
* 缺点:有一定的学习门槛,定义类型等工作会加大工作量,要转换成js执行,调试效率低一些.转换js后的代码不是最优代码.
*/




/**
 *  第十题
 * 引用计数每个对象有一个引用计数器,当引用对象的变量增加一个,计数器加一,当引用对象的变量减少一个,计数器减一.当没有变量引用他的时候,计数器为0
 * 优点:能立即销毁垃圾对象,最大限度减少程序暂停
 * 缺点:对性能消耗比较大,循环引用的对象不能回收,造成内存泄漏
 */


/**
 *  第十一题
 * 当内存达到预警,启动标记整理垃圾回收.
 * 先标记所有可达对象为活动对象,
 * 清除非标记的对象
 * 整理内存空间,将对象占用的内存移动到一起,让空间不碎片化.
 * 整个过程可以分很多小任务去执行,降低程序暂停时间,尽量让用户不感受到卡顿
 */



/**
 *  十二题
 * 新生代存储区比较小,在64位上是32M 在 32位系统上是16M.
 * 新生代存储区分为大小相等的两个区域,一个from区域,一个to区域,当
 * from区的内存占用超过警戒值,先标记活动对象,再将活动对象拷贝到to区,然后将from区的内存全部释放,
 * 最后原来的to区就是新的from区,新的to区是原来的from区.
 * 在拷贝的过程中如果有的对象已经经历过一轮拷贝依旧存在,那么就将他晋升到老生代区.
 * 如果有特别大的对象要存储到内存,也会放到老生代区.
 *
 */


/**
 *  十三题
 * 增量标记在老生区内存增长超过警戒线需要垃圾回收时使用
 * 原理:将标记过程分为一个个小的子标记过程,让垃圾回收标记和 JavaScript 应用逻辑交替进行,
 * 直到标记阶段完成,这些小任务执行时间较短,可以穿插在JavaScript 任务中间去执行,因而让用户不会应为垃圾回收感受到页面卡顿.
 *
 */














